﻿//////////////////////////////////////////////////////////////////////////////
//
// Copyright © 1998-2024 Glodon Company Limited.
//
// Licensed under the MIT License
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the “Software”),
// to deal in the Software without restriction, including without limitation
// the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
//////////////////////////////////////////////////////////////////////////////
#pragma once

#include "GbmpUiPlatform.h"
#include "IElementFilter.h"
#include "IFamilyLoadOptions.h"
namespace gcmp
{
    class IDocument;
    class IInstance;
    struct LoadFamilyInfos;
    struct LoadFamilyResult;
}

namespace gcmp
{
    class GBMP_UI_PLATFORM_EXPORT UiPlatformUtils
    {
    public:
        static void DefineFunctionForBindingDllDependency();

        // 新建文档后的UI层处理
        static void PrepareUiForNewDocument(gcmp::IDocument * doc);
        // 打开文档后的UI层处理
        //static void PrepareUiForOpenDocument(gcmp::IDocument * doc);
        static void PrepareUI(gcmp::IDocument* pDoc);
        // 加载族
        static bool LoadFamily(gcmp::IDocument * doc, const std::wstring& familyFilePath, std::wstring& errorMsg);

        // 加载族
        static bool LoadFamilyInCloud(gcmp::IDocument * doc, const LoadFamilyInfos& loadFamilyInfos, std::wstring& errorMsg, LoadFamilyResult* pLoadFamilyResult);

        // 重命名族
        static bool RenameFamily(gcmp::IDocument* pDoc, const std::wstring& oldFamilyName, const std::wstring& newFamilyName);
        // 族文件另存为
        static bool SaveFamilyFileAs(gcmp::IDocument* pDoc, const std::wstring& familyName, const std::wstring& newFamilyFilePath);
        // 删除族
        static bool DeleteFamily(gcmp::IDocument * doc, const std::wstring& familyName);

        // 得到Family的所有Instance
        static std::vector<const gcmp::IInstance*> GetFamilyInstances(gcmp::IDocument * doc, const std::wstring& familyName);
        static bool GetFamilyLoadStrategy(gcmp::IDocument* pDoc, const std::wstring& filePathName, gcmp::FamilyFoundStrategy* pStrategy);
    };


    class GBMP_UI_PLATFORM_EXPORT  ElementFilterExceptFamilyAndType : public gcmp::IElementFilter
    {
        DEFINE_CAST_DERIVED(ElementFilterExceptFamilyAndType, gcmp::IElementFilter)
    public:
        /// \brief 判断元素是否通过过滤器
        /// \return true 通过，false 不通过
        virtual bool PassesFilter(const IElement* pElement) const;
    };
}



